package com.xxxx.server.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger2配置类
 */
@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean//规定扫描哪些包下面生成swagger2文档
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //选择扫描哪个包
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xxxx.server.controller"))
                //所有的路径都可以
                .paths(PathSelectors.any())
                .build()
                //给swagger2令牌，不然测试接口太繁琐，需要登录会被拦截
                .securityContexts(securityContexts())//全局
                .securitySchemes(securitySchemes());//安全计划

    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //标题
                .title("云E办接口文档")
                //描述
                .description("1、本系统只给一个老师使用，老师进入系统可发布本学期课程信息，针对某一课程，老师可以上传课件及相应的教学资源，学生可以下载相应的资料\n" +
                        "2、教师就是管理员admin，设置为admin。针对某一门课程，老师可以导入学生信息，只有被导入学生信息才可以看到该课程，学生登录信息直接导入的信息生成，学号默认为登录名，学号后6为默认为登录密码，教师学生都可以修改密码，\n" +
                        "3、老师可以发布通知，布置作业，学生针对布置的作业可以在线提交作业，学生提交后的作业，老师可以单个下载也可以一次性打包下载，批改成绩后可以在系统上录入该学生该次作业成绩\n" +
                        "4、学期结束后，教师可以按指定格式导出某门课程所有作业的成绩 \n" +
                        "5、课程完全结束后，教师可以一键备份本课程的教学资料，将本课程通知，布置的作业，老师上传的资源。。。全部下载的本地\n" +
                        "6、对于已经结束的课程，教师可设置该课程对学生不可见，必要的时候也可以恢复该课程的可见状态 ")
                .contact(new Contact("xxxx", "http:localhost:9090/doc.html", "2471256776@qq.com"))
                .version("1.0")
                .build();
    }

    private List<ApiKey> securitySchemes() {
        //设置请求头信息
        List<ApiKey> result = new ArrayList<>();
        //令牌
        ApiKey apikey = new ApiKey("authorization", "authorization", "Header");
        result.add(apikey);
        return result;
    }

    private List<SecurityContext> securityContexts() {
        //设置需要登录认证的路径
        List<SecurityContext> result = new ArrayList<>();
        result.add(getContextBypath("/hello/.*"));
//        result.add(getContextBypath("/resources/*"));
        return result;
    }

    private SecurityContext getContextBypath(String pathRegex) {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex(pathRegex))
                .build();
    }

    private List<SecurityReference> defaultAuth() {
        List<SecurityReference> result = new ArrayList<>();
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        result.add(new SecurityReference("Authorization", authorizationScopes));
        return result;
    }

}
